package br.uniceub.fsw.talentos.dao;

import br.uniceub.fsw.arquitetura.persistencia.dao.BaseDAO;
import br.uniceub.fsw.arquitetura.persistencia.dao.ConstrutorSQL;
import br.uniceub.fsw.talentos.vo.TipoOcorrenciaVO;
import java.io.Serializable;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

public class TipoOcorrenciaDAO extends BaseDAO<TipoOcorrenciaVO> {

    @Override
    public void inserir(TipoOcorrenciaVO tipoOcorrencia) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("INSERT INTO TT_TipoOcorrencia(NO_Ocorrencia, DS_Ocorrencia)");
        query.append("VALUES (?, ?)");

        List<?> parametros = criarParametros(tipoOcorrencia.getNoOcorrencia(),
                tipoOcorrencia.getDsOcorrencia());

        Integer idGerado = ((Long) executarInsercao(query.toString(), parametros)).intValue();

        tipoOcorrencia.setIdTipoOcorrencia(idGerado);
    }

    @Override
    public void alterar(TipoOcorrenciaVO tipoOcorrencia) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("UPDATE TT_TipoOcorrencia SET NO_Ocorrencia = ?,");
        query.append("DS_Ocorrencia = ?");
        query.append("WHERE ID_TipoOcorrencia = ?");

        List<?> parametros = criarParametros(tipoOcorrencia.getNoOcorrencia(), tipoOcorrencia.getDsOcorrencia(),
                tipoOcorrencia.getIdTipoOcorrencia());

        executarAlteracao(query.toString(), parametros);
    }

    @Override
    public void excluir(TipoOcorrenciaVO tipoOcorrencia) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("DELETE FROM TT_TipoOcorrencia");
        query.append("WHERE ID_TipoOcorrencia = ?");

        executarAlteracao(query.toString(), criarParametros(tipoOcorrencia.getIdTipoOcorrencia()));
    }

    @Override
    public TipoOcorrenciaVO consultarPorId(Serializable id) {

        TipoOcorrenciaVO tipoOcorrencia = null;

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("SELECT * FROM TT_TipoOcorrencia T WHERE T.ID_TipoOcorrencia = ?");

        tipoOcorrencia = consultarUm(query.toString(), criarParametros(id));

        return tipoOcorrencia;
    }

    @Override
    public List<TipoOcorrenciaVO> consultarPorExemplo(TipoOcorrenciaVO tipoOcorrencia) {

        List<TipoOcorrenciaVO> listaRetorno = null;

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("SELECT * FROM TT_TipoOcorrencia T WHERE 1=1");

        mapearQueryParaExemplo(query, tipoOcorrencia);

        listaRetorno = consultar(query.toString(), recuperarParametros());

        return listaRetorno;
    }

    public List<TipoOcorrenciaVO> consultarTudo(TipoOcorrenciaVO tipoOcorrencia) {

        List<TipoOcorrenciaVO> listaRetorno = null;

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("SELECT * FROM TT_TipoOcorrencia T ");

        mapearQueryParaExemplo(query, tipoOcorrencia);

        listaRetorno = consultar(query.toString(), recuperarParametros());

        return listaRetorno;
    }
    @Override
    protected TipoOcorrenciaVO extrairObjetoResultado(ResultSet rs) throws SQLException {

        TipoOcorrenciaVO tipoOcorrencia = new TipoOcorrenciaVO();

        tipoOcorrencia.setIdTipoOcorrencia(rs.getInt("ID_TipoOcorrencia"));
        tipoOcorrencia.setNoOcorrencia(rs.getString("NO_Ocorrencia"));
        tipoOcorrencia.setDsOcorrencia(rs.getString("DS_Ocorrencia"));

        return tipoOcorrencia;
    }

     /**
     * Recupera uma lista completa de tipos ordenada pelo nome
     *
     * @return lista de grupos
     */
    public List<TipoOcorrenciaVO> consultarTiposOrdenadoPorNome() {
        ConstrutorSQL sql = new ConstrutorSQL();

        sql.append("SELECT *");
        sql.append("FROM TT_TipoOcorrencia A");
        sql.append("ORDER BY NO_Ocorrencia ASC");

        return consultar(sql.toString());
    }

    @Override
    protected void mapearQueryParaExemplo(ConstrutorSQL query, TipoOcorrenciaVO tipoOcorrencia) {

        if (tipoOcorrencia.getNoOcorrencia() != null && !tipoOcorrencia.getNoOcorrencia().isEmpty()) {
            query.append("AND T.NO_Ocorrencia LIKE ?");
            adicionarParametro( "%" + tipoOcorrencia.getNoOcorrencia()+ "%");
        }

        if (tipoOcorrencia.getDsOcorrencia() != null && !tipoOcorrencia.getDsOcorrencia().isEmpty()) {
            query.append("AND T.DS_TipoOcorrencia LIKE ?");
            adicionarParametro("%" + tipoOcorrencia.getDsOcorrencia() + "%");
        }
    }
}